/**
 * # 参数列表实体类:
 *  Demand - 执行权限检查
 * 
 * # 描述:
 *  验证当前用户是否对目标功能拥有权限。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.authority.authentication.args;

/**
 * 功能 执行权限检查 的参数列表。
 */
@pittypat.FunctionAnnotation(transaction = false)
public final class Demand extends pittypat.FunctionArgs {
	/**
	 * 用户令牌。
	 * <p>
	 * 用户登录令牌。
	 */
	@pittypat.ParameterAnnotation(position = 0, fixedLength = true, maxLength = 36)
	public byte[] token;

	/**
	 * 功能路径。
	 * <p>
	 * 目标功能的路径，格式为：开发者代码.App标识符.模块标识符.功能标识符。
	 */
	@pittypat.ParameterAnnotation(position = 1, maxLength = 128)
	public String path;

	/**
	 * 是否已授权。
	 * <p>
	 * 指示是否已经授权当前用户访问目标功能。
	 */
	@pittypat.ParameterAnnotation(position = 2, direction = pittypat.ParameterDirection.OUT)
	public Boolean authorized;

	/**
	 * 用户信息。
	 * <p>
	 * 返回当前用户的用户信息。
	 */
	@pittypat.ParameterAnnotation(position = 3, direction = pittypat.ParameterDirection.OUT)
	public com.waln.authority.authentication.data.User user;

	/**
	 * 初始化 Demand 类的一个新实例。
	 */
	public Demand() {
		super();

		// 用户令牌
		this.token = null;
		// 功能路径
		this.path = null;
		// 是否已授权
		this.authorized = null;
		// 用户信息
		this.user = null;
	}

	/**
	 * 获取指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @return 指定名称的参数值。
	 */
	@Override
	public Object getParameterValue(String name) {
		if (name == null || name.length() == 0) {
			return null;
		}

		switch (name.toLowerCase()) {
			case "token":
				return this.token;
			case "path":
				return this.path;
			case "authorized":
				return this.authorized;
			case "user":
				return this.user;
			default:
				return null;
		}
	}

	/**
	 * 设置指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @param value
	 * 			参数值。
	 * 
	 * @throws IllegalArgumentException
	 */
	@Override
	public void setParameterValue(String name, Object value) throws IllegalArgumentException {
		if (name == null || name.length() == 0) {
			throw new IllegalArgumentException("没有提供有效的参数名称。");
		}

		switch (name.toLowerCase()) {
			case "token":
				this.token = (byte[]) value;
				break;
			case "path":
				this.path = (String) value;
				break;
			case "authorized":
				this.authorized = (Boolean) value;
				break;
			case "user":
				this.user = (com.waln.authority.authentication.data.User) value;
				break;
			default:
				throw new IllegalArgumentException(name + " 不是 " + this.getClass().getName() + " 的有效参数属性名称。");
		}
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// 用户令牌
		writer.write("\"token\":");
		pittypat.Json.write(writer, this.token);
		writer.write(',');

		// 功能路径
		writer.write("\"path\":");
		pittypat.Json.write(writer, this.path);
		writer.write(',');

		// 是否已授权
		writer.write("\"authorized\":");
		pittypat.Json.write(writer, this.authorized);
		writer.write(',');

		// 用户信息
		writer.write("\"user\":");
		pittypat.Json.write(writer, this.user);

		writer.write('}');
	}
}
